//
//  putViewController.m
//  网络
//
//  Created by hfzhangzhang on 2018/4/12.
//  Copyright © 2018年 hfzhangzhang. All rights reserved.
//

#import "putViewController.h"
//  无论是上传还是下载哥么默认都是  -- 单线程的!!
//  如何实现多线程下载(注意:多线程不是指 子线程!!!)

@interface putViewController ()<NSURLSessionTaskDelegate>
/** 会话  */
@property(nonatomic,strong)NSURLSession * session;
@end

@implementation putViewController

-(NSURLSession *)session
{
    if (!_session) {
        NSURLSessionConfiguration * config = [NSURLSessionConfiguration defaultSessionConfiguration];
        _session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil];
    }
    return _session;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
    
    
}


- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    [self putUpload];
    
}

#pragma mark - <WebDav HEAD>
-(void)webdavHead{
    NSURL * url = [NSURL URLWithString:@"http://192.168.31.180/uploads/123.wmv"];
    NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url];
    //发起任务
    [[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        NSLog(@"%@",response);
    }] resume];
}


#pragma mark - <删除>
/**
 
 GET     查          - 下载文件(不需要身份验证)
 POST    增          - WebDav不支持POST请求!!
 DELETE  删(不安全)   - 删除服务器上的文件(需要身份验证)
 PUT     改(不安全)   - 修改服务器上的文件(需要身份验证)
 
 HEAD    获取信息     - 获取文件信息(不需要身份验证)
 
 RESTful 设计风格,以上5个方法,越来越普及
 
 关于安全:WebDav只是使用base64,并不安全!
 WebDav应用场景:可以开发企业级的应用,公司的办公自动化系统!
 
 */

-(void)webDavDelete{
    NSURL * url = [NSURL URLWithString:@"http://192.168.31.180/uploads/123.wmv"];
    //2.请求
    NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url];
    request.HTTPMethod = @"DELETE";
    //设置身份验证的数据
    NSString * authStr = [self base64Encode:@"admin:123456"];
    authStr = [@"BASIC " stringByAppendingString:authStr];
    //设置请求头
    [request setValue:authStr forHTTPHeaderField:@"Authorization"];
    //3.同session发起任务
    [[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        NSLog(@"%@",response);
    }] resume];
    
}


#pragma mark - <上传演练>
/**
 POST 上传,很多公司在做POST的时候,会有文件大小的限制!
 PUT  上传,不会有文件大小的限制!
 
 */

-(void)putUpload{
    //1.url - URL是直接保存在服务器上的文件名
    NSURL * url = [NSURL URLWithString:@"http://192.168.31.180/uploads/123.wmv"];
    //2.请求
    NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url];
    //设置请求方法-webdav上传需要使用put方法
    request.HTTPMethod = @"PUT";
    //设置身份验证的数据
    NSString * authStr = [self base64Encode:@"admin:123456"];
    authStr = [@"BASIC " stringByAppendingString:authStr];
    //设置请求头
    [request setValue:authStr forHTTPHeaderField:@"Authorization"];
    
    //3.session
    //上传的源文件的路径!!
    NSURL * fileUrl = [[NSBundle mainBundle] URLForResource:@"abc.wmv" withExtension:nil];
    // 上传任务如果跟进进度,可以同时使用代码块Blcok的方式
    [[self.session uploadTaskWithRequest:request fromFile:fileUrl completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        NSString * str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        
        NSLog(@"%@ %@",str,response);
        
    }] resume];
}


#pragma mark - <代理>

/**
 参数:
 session
 task
 
 bytesSent                  本次发送的字节数
 totalBytesSent             已经发送的字节数
 totalBytesExpectedToSend   总字节数(文件总大小)
 */
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didSendBodyData:(int64_t)bytesSent totalBytesSent:(int64_t)totalBytesSent totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend
{
    float progress = (float)totalBytesSent / totalBytesExpectedToSend;
    NSLog(@"%f %@",progress,[NSThread currentThread]);
}


/**  -- 经常用!而且在密码学里面必须会!
 WebDav 的用户名密码格式
 
 格式:BASIC(用户名:密码)base64编码
 admin:123456
 
 */
-(NSString *)base64Encode:(NSString *)str{
    //1.转成二进制
    NSData * data = [str dataUsingEncoding:NSUTF8StringEncoding];
    //2.base64编码
    return [data base64EncodedStringWithOptions:0];
    
}


//MARK: BASE64
/*
 对一个二进制数据进行编码 会是源文件的 4/3 的大小 会大1/3 左右!!
 从iOS 7.0开始.苹果提供了base64 的编码和解码的支持!!
 如果是老项目,可能会看到base64的三方框架!!
 */


@end
